package dsa

import (
	"crypto/dsa"
	"crypto/rand"
	"math/big"
)

func GenerateKey() (dsa.PrivateKey, dsa.PublicKey) {
	// parameters 是私钥的参数
	var param dsa.Parameters
	// L1024N160是一个枚举，根据L1024N160来决定私钥的长度（L N）
	err := dsa.GenerateParameters(&param, rand.Reader, dsa.L1024N160)
	if err != nil {
		panic(err.Error())
	}
	// 定义私钥的变量
	var privateKey dsa.PrivateKey
	// 设置私钥的参数
	privateKey.Parameters = param
	// 生成密钥对
	err = dsa.GenerateKey(&privateKey, rand.Reader)
	if err != nil {
		panic(err.Error())
	}
	// 公钥是存在在私钥中的，从私钥中读取公钥
	publicKey := privateKey.PublicKey
	return privateKey, publicKey
}

// 签名
func Sign(message string, key dsa.PrivateKey) (*big.Int, *big.Int) {
	r, s, err := dsa.Sign(rand.Reader, &key, []byte(message))
	if err != nil {
		panic(err.Error())
	}
	return r, s
}

// 验证
func Verify(message string, key dsa.PublicKey, r, s *big.Int) bool {
	return dsa.Verify(&key, []byte(message), r, s)
}
